from django.db import models

# Create your models here.
class User(models.Model):
    """ 个人账户 """
    usermail = models.CharField(verbose_name="邮箱", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)

    # 可提升查询效率
    # price_policy = models.ForeignKey(verbose_name="价格策略", to='PricePolicy',null=True, blank=True)

class PricePolicy(models.Model):
    """ 价格策略 """
    category_choices = (
        (1, '免费版'),
        (2, '收费版'),
        (3, '其他版'),
    )

    category = models.SmallIntegerField(verbose_name="收费类型", default=1, choices=category_choices)
    title = models.CharField(verbose_name="标题", max_length=32)
    price = models.PositiveIntegerField(verbose_name="价格")

    # PositiveBigIntegerField - 存储​非负大整数​​（0 到 9223372036854775807）
    project_num = models.PositiveBigIntegerField(verbose_name="项目数")
    project_member = models.PositiveBigIntegerField(verbose_name="项目成员数")
    project_space = models.PositiveBigIntegerField(verbose_name="单项目空间")
    per_file_size = models.PositiveBigIntegerField(verbose_name="单文件大小(M)")

    # 1.存储 ​​日期和时间​​（精确到毫秒）
    # 2.auto_now_add=True：当对象 ​​第一次创建​​ 时自动设置为当前时间
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

class Transaction(models.Model):
    """ 交易记录 """
    status_choices = (
        (1, "已支付"),
        (2, "未支付"),
    )
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices)

    order = models.CharField(verbose_name="订单号", max_length=64, unique=True)

    user = models.ForeignKey(verbose_name="用户", to='User', on_delete=models.CASCADE, help_text="G")
    price_policy = models.ForeignKey(verbose_name="价格策略", to="PricePolicy", on_delete=models.CASCADE, help_text="M")

    count = models.IntegerField(verbose_name="数量(年)", help_text='0表示无期限')

    price = models.IntegerField(verbose_name="实际支付价格")

    start_datetime = models.DateTimeField(verbose_name="开始时间", null=True, blank=True)
    end_datetime = models.DateTimeField(verbose_name="结束时间", null=True, blank=True)

    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    
class Project(models.Model):
    """ 项目表 """
    COLOR_CHOICES = (
        (1, '#56b8eb'),
        (2, '#f28003'),
        (3, '#ebc656'),
        (4, '#a2d148'),
        (5, '#20BFA4'),
        (6, '#7461c2'),
        (7, '#20bfa2'),
    )

    name = models.CharField(verbose_name="项目名", max_length=32)
    color = models.SmallIntegerField(verbose_name="颜色", choices=COLOR_CHOICES, default=1)
    desc = models.CharField(verbose_name="项目描述", max_length=255, null=True, blank=True)
    use_space = models.IntegerField(verbose_name="项目已使用空间", default=0)
    star = models.BooleanField(verbose_name="星标", default=False)

    join_count = models.SmallIntegerField(verbose_name="参与人数", default=1)
    creator = models.ForeignKey(verbose_name="创建者", to="User", on_delete=models.CASCADE)

    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    bucket = models.CharField(verbose_name="cos桶", max_length=128)
    region = models.CharField(verbose_name="cos区域", max_length=32)

    # 查询: 可以省事
    # 增加、删除、修改：无法完成
    # projec_user = models.ManyToManyField(to='User', through='ProjectUser', through_fields=('project',"join_user"))

class ProjectUser(models.Model):
    """ 项目参与者 """

    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)

    # related_name=''解决反向关联的问题
    join_user = models.ForeignKey(verbose_name="参与者", to="User", on_delete=models.CASCADE)
    # inviter = models.ForeignKey(verbose_name="邀请者", to='User', related_name='inviter')


    star = models.BooleanField(verbose_name="星标", default=False)


    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

class Wiki(models.Model):
    """ 文件表 """
    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)
    title = models.CharField(verbose_name="标题", max_length=32)
    content = models.TextField(verbose_name="内容")
    
    depth = models.IntegerField(verbose_name="深度", default=1)

    # 子关联
    parent = models.ForeignKey(verbose_name="父文章", to="Wiki", null=True, blank=True, related_name='children', on_delete=models.CASCADE)

    def __str__(self):
        return  self.title


class FileRepository(models.Model):
    """ 文件库 """
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    file_type_choices = (
        (1, '文件'),
        (2, '文件夹')
    )
    file_type = models.SmallIntegerField(verbose_name='类型', choices=file_type_choices)
    name = models.CharField(verbose_name='文件夹名称', max_length=32, help_text="文件/文件夹名")
    key = models.CharField(verbose_name='文件储存在COS中的KEY', max_length=128, null=True, blank=True)
    file_size = models.IntegerField(verbose_name='文件大小', null=True, blank=True)
    file_path = models.CharField(verbose_name='文件路径', max_length=255, null=True, blank=True) # https://桶.cos.ap-chengdu/....
    
    parent = models.ForeignKey(verbose_name='父级目录', to='self', related_name='child', null=True, blank=True, on_delete=models.CASCADE)

    update_user = models.ForeignKey(verbose_name='最近更新者', to='User', on_delete=models.CASCADE)
    update_datetime = models.DateTimeField(verbose_name='更新时间', auto_now=True)